module ReadData
implicit none

	contains
	
	subroutine readFile(fileNamePrefix,fileNameSuffix,matrixPt)
	!从文件中读取二维数组，该数组中每个元素都是 8 bytes 的浮点数。.matr,.sol和.rhs文件均是用二维数组表示。
	!文件的前16个字节表示数组的行数和列数，第5~8个字节用一个int32的数表示数组的行数，第9~12个字节用另一个int32的数表示数组的列数。
	!第1~4字节和第13~16字节是Fortran自动填充的数据块大小说明数据，在使用Intel oneAPI编译的Fortran程序读取数据时，会自动忽略这部分数据（如本子程序所示）。
	!第17~20字节和文件的最后4字节是Fortran自动填充的数据块大小说明数据，在使用Intel oneAPI编译的Fortran程序读取数据时，会自动忽略这部分数据（如本子程序所示）。
	!从第21字节开始至倒数第5个字节之间的数据为数组中各个元素的数值。
		CHARACTER(LEN=*),intent(in)           :: fileNamePrefix,fileNameSuffix
		REAL(kind=8), DIMENSION(:,:), pointer, intent(inout) :: matrixPt
		
		integer :: fileId
		integer :: nRows, nCols
		
		
		OPEN(newunit=fileId, FILE=TRIM(ADJUSTL(fileNamePrefix))//TRIM(ADJUSTL(fileNameSuffix)), STATUS='OLD', FORM='UNFORMATTED')

		READ(fileId) nRows, nCols

		ALLOCATE(matrixPt(nRows,nCols))

		READ(fileId) matrixPt

		CLOSE(fileId)
		
	end subroutine readFile
	
	subroutine readVector(fileNamePrefix,fileNamesuffix,vectorPt)
	!读取向量，本赛题中用于读取".rhs"和".sol"文件
		CHARACTER(LEN=*),intent(in)           :: fileNamePrefix
		CHARACTER(LEN=*),intent(in)           :: fileNamesuffix
		
		REAL(kind=8), DIMENSION(:), pointer, intent(inout) :: vectorPt
		REAL(kind=8), DIMENSION(:,:), pointer:: matrixPt
		
		
		call readFile(fileNamePrefix,fileNamesuffix,matrixPt)
		vectorPt => matrixPt(:,1)
	end subroutine readVector
	
	subroutine readMatrix(fileNamePrefix,fileNamesuffix,matrixPt)
	!读取矩阵，本赛题中用于读取".matr"文件
		CHARACTER(LEN=*),intent(in)           :: fileNamePrefix
		CHARACTER(LEN=*),intent(in)           :: fileNamesuffix
		REAL(kind=8), DIMENSION(:,:), pointer, intent(inout):: matrixPt
		
		call readFile(fileNamePrefix,fileNamesuffix,matrixPt)
		
	end subroutine readMatrix
	
end module